package br.com.q7solucoes.commons.utils;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import org.apache.commons.io.FileUtils;

/**
 * Contem metodos para leitura e copia de arquivos de dentro do jar.
 *
 * @author Elenilson Vieira - elenilson[at]q7solucoes.com.br
 * @since 04 de janeiro de 2011
 * @version 1.0
 * @see www.q7solucoes.com.br
 */
public class FileUtilsFromJar {

    /**
     * Construtor e' privado.
     */
    private FileUtilsFromJar() {
    }

    /**
     * Ler bytes de um determinado arquivo.
     *
     * @param path o caminho do arquivo dentro do jar
     *
     * @return os bytes lidos
     */
    public static byte[] readBytesFileFromJar(String path) throws IOException {
        InputStream input = FileUtilsFromJar.class.getResourceAsStream(path);
        ByteArrayOutputStream output = new ByteArrayOutputStream(1024);

        byte[] buffer = new byte[512];

        int bytes;

        while ((bytes = input.read(buffer)) > 0) {
            output.write(buffer, 0, bytes);
        }

        input.close();
        return output.toByteArray();
    }

    /**
     * Copia um arquivo de dentro do jar para
     * @param from
     * @param to
     * @throws IOException
     */
    public static void copyFileFromJar(String from, String to) throws IOException{
        byte[] bytes = readBytesFileFromJar(from);
        FileOutputStream fos= new FileOutputStream(to);
        fos.write(bytes);
        fos.close();
    }

    /**
     * Ler um diretorio de dentro do jar
     *
     * @param path o caminho do diretorio
     * @return o file
     */
    @Deprecated
    public static File readDirectoryFileFromJar(String path){
        URL url = FileUtilsFromJar.class.getResource(path);
        return new File(url.getPath());
    }

    /**
     * Ler o conteudo de um arquivo texto.
     *
     * @param path o caminho do arquivo texto dentro do jar
     *
     * @return o conteudo do arquivo
     */
    public static String readStringFromAFileJar(String path) {
        InputStream is = null;
        BufferedReader br = null;
        String line;
        StringBuilder content = new StringBuilder();

        try {
            is = FileUtils.class.getResourceAsStream(path);
            br = new BufferedReader(new InputStreamReader(is));
            while (null != (line = br.readLine())) {
                content.append(line).append("\n");
            }
        } catch (Exception e) {
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
            }
        }
        return content.toString();
    }

}
